package de.fhluebeck.oop.gps.service.impl;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.fhluebeck.oop.gps.common.Constants;
import de.fhluebeck.oop.gps.common.DependencyManager;
import de.fhluebeck.oop.gps.common.Singleton;
import de.fhluebeck.oop.gps.dao.IDAO;
import de.fhluebeck.oop.gps.entity.Category;
import de.fhluebeck.oop.gps.entity.Poi;
import de.fhluebeck.oop.gps.service.IPoiService;

/**
 * Implementation des Interfaces für den POI-Service.
 * 
 * @author Ogün Bilge, Leif Hitzschke
 * @version 1.00, 13.11.2009
 * 
 */
@SuppressWarnings("unchecked")
public class PoiServiceImpl implements IPoiService, Singleton {

	private final static Logger log = LoggerFactory
			.getLogger(PoiServiceImpl.class);

	private IDAO<Poi> poiDao = (IDAO<Poi>) DependencyManager
			.locate(Constants.POI_DEP_NAME);
	private IDAO<Category> categoryDao = (IDAO<Category>) DependencyManager
			.locate(Constants.CATEGORY_DEP_NAME);

	// Holder Idiom Pattern
	private static class Holder {
		private static final IPoiService instance = new PoiServiceImpl();
	}

	public static IPoiService getInstance() {
		return Holder.instance;
	}

	@Override
	public List<Poi> getPoiList(String tel, String lat, String lng) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void createDummyPois() {
		try {
			List<Category> categories = categoryDao.readAll();

			List<Poi> pois = poiDao.readAll();
			for (Poi poi : pois) {
				poiDao.delete(poi);
			}

			Poi poi = new Poi();
			poi.setCategory(categories.get(0));
			poi.setName("Jacobi Kirche");
			poi.setDescription("Die Jakobikirche ist eine der fünf evangelisch-lutherischen Hauptpfarrkirchen in der Lübecker Altstadt.\n\n" +
					"Sie wurde im Jahre 1334 als Kirche der Seefahrer und Fischer geweiht, die ihr Schütting noch heute in der gegenüberliegenden Schiffergesellschaft haben. Ihr Patron ist der Heilige Jakobus der Ältere; die Kirche ist eine Station auf einem Zweig des Jakobswegs von Nordeuropa nach Santiago de Compostela. Seit September 2007 ist die nördliche Turmkapelle der Kirche als Pamir-Kapelle Nationale Gedenkstätte für die zivile Seefahrt.");
			poi.setLng(10.689167);
			poi.setLat(53.8713);
			poi.setTimestmp(new Date());
			poiDao.create(poi);

			poi = new Poi();
			poi.setCategory(categories.get(0));
			poi.setName("Holstentor");
			poi.setDescription("Das Holstentor („Holstein-Tor“) ist ein Stadttor, das die Innenstadt der Hansestadt Lübeck nach Westen begrenzt. Wegen seines hohen Bekanntheitsgrades gilt es heute als Wahrzeichen der Stadt. Das spätgotische Gebäude gehört zu den Überresten der Befestigungsanlagen der Lübecker Stadtbefestigung. Es ist neben dem Burgtor das einzige erhaltene Stadttor Lübecks.");
			
			poi.setLng(10.6796);
			poi.setLat(53.8663);
			poi.setTimestmp(new Date());
			poiDao.create(poi);

			poi = new Poi();
			poi.setCategory(categories.get(0));
			poi.setName("Burgkloster");
			poi.setDescription("Das Burgkloster befindet sich im Norden der Lübecker Altstadt zwischen Burgtor und Koberg, es verbirgt sich hinter dem neugotischen ehemaligen Gerichtsgebäude in der Großen Burgstraße, (heute Landesamt für soziale Dienste). Das Burgkloster wurde 1227 gegründet. Sein ursprünglicher Name „Maria-Magdalenen-Kloster“ geht auf die siegreiche Schlacht von Bornhöved zurück. Diese Schlacht fand am 22. Juli statt, dem Maria-Magdalenen-Tag.");
			poi.setLng(10.689297);
			poi.setLat(53.873525);
			poi.setTimestmp(new Date());
			poiDao.create(poi);

		} catch (SQLException e) {
			log.error("error while creating dummy records");
			throw new RuntimeException(e);
		}

	}

	@Override
	public List<Poi> readAll() {

		try {
			List<Poi> pois = poiDao.readAll();
			return pois;
		} catch (SQLException e) {
			log.error("error while reading records");
			throw new RuntimeException(e);
		}
	}

	@Override
	public Poi update(Poi poi) {
		try {
			poi.setTimestmp(new Date());
			return poiDao.update(poi);
		} catch (SQLException e) {
			log.error("error while updating poi");
			throw new RuntimeException(e);
		}
	}

	@Override
	public Poi create(Poi poi) {	
		try {
			poi.setTimestmp(new Date());
			return poiDao.create(poi);
		} catch (SQLException e) {
			log.error("error while creating poi");
			throw new RuntimeException(e);
		}
	}
}
